package com.coocaa.app.lib.cleaner.scanner.config;

import com.coocaa.app.lib.cleaner.scanner.config.impl.ConfigDataImpl;
import com.coocaa.app.lib.cleaner.u.AbstractFactory;

import java.util.List;

/**
 * Created by lu on 17-4-17.
 */

public class ConfigDataFactory {// extends AbstractFactory<ConfigDataImpl> {

    public interface ConfigData {
        /**
         * 追加所有
         *
         * @param data
         * @return
         */
        ConfigData appendAll(ConfigData data);

        /**
         * 追加应用不能删除的文件（目录）
         * 排除路径/data/data/packageName
         *
         * @param packageName
         * @param file        文件绝对路径
         * @return
         */
        ConfigData appendPackageKeep(String packageName, String file);

        /**
         * 追加指定删除的文件，当扫描应用数据时，只会扫描通过这个接口配置的文件
         * 如果有配置这个，则不会再扫描/data/data/packageName，
         * 并且packageKeep配置的策略失效
         *
         * @param packageName
         * @param file
         * @return
         */
        ConfigData appendPackageDel(String packageName, String file);

        /**
         * 扫描其他垃圾时，追加文件系统中不能删除的文件（目录）
         * <p>
         * 此策略应该不会用到
         *
         * @param file
         * @return
         */
        ConfigData appendFileKeep(String file);

        /**
         * 扫描其他垃圾是，追加文件系统中必须删除的文件（目录）
         *
         * @param file
         * @return
         */
        ConfigData appendFileDel(String file);

        /**
         * 增加不扫描的包
         *
         * @param packageName
         * @return
         */
        ConfigData appendIgnorePackage(String packageName);

        /**
         * 判断某个应用是否在不扫描范围内
         *
         * @param packageName
         * @return
         */
        boolean containsIgnorePackage(String packageName);


        /**
         * 判断某个包是否全部扫描
         * <p>
         * 如果appendPackageKeep的包
         * 或appendPackageDel的包，则返回false
         *
         * @param packageName
         * @return
         */
        boolean isFullScan(String packageName);

        /**
         * 判断不能删除列表中是否包含指定应用的指定文件（目录）
         *
         * @param packageName
         * @param file
         * @return
         */
        boolean containsPackageKeep(String packageName, String file);

        /**
         * 判断不能删除列表中是否包含指定文件系统中的文件（目录）
         *
         * @param file
         * @return
         */
        boolean containsFileKeep(String file);

        void appendCacheKeep(String packageName);

        boolean containsCacheKeep(String packageName);

        /**
         * 获取配置的所有需要删除的文件
         *
         * @return
         */
        List<String> getFileDelFiles();

        List<String> getPackageDelFiles(String packageName);

        List<String> getFileKeepFiles();

        List<String> getPackageKeepFiles(String packageName);

        boolean containsPackageDel(String packageName, String file);

        boolean containsFileDel(String file);
    }

    public static final ConfigDataFactory factory = new ConfigDataFactory();

    private ConfigDataImpl instance = null;

    public ConfigDataImpl create() {
        return new ConfigDataImpl();
    }

    public synchronized ConfigDataImpl instance() {
        if (instance == null)
            instance = create();
        return instance;
    }
}
